from minio import Minio
from minio.error import S3Error
from dotenv import load_dotenv
import os


# 1. 加载环境变量（包含 Redis 连接信息）
load_dotenv()




def upload_file_to_minio(file_path, bucket_name, object_name=None):
    """
    上传文件到 MinIO

    参数:
        file_path: 本地文件路径
        bucket_name: MinIO 存储桶名称
        object_name: 在 MinIO 中的对象名称（可选，默认为文件名）
    """
    # 从环境变量获取 MinIO 配置
    minio_endpoint = os.getenv("MINIO_ENDPOINT", "localhost:9000")
    minio_access_key = os.getenv("MINIO_ACCESS_KEY", "minioadmin")
    minio_secret_key = os.getenv("MINIO_SECRET_KEY", "minioadmin")
    minio_secure = os.getenv("MINIO_SECURE", "False") == "True"  # 是否使用 SSL

    try:
        # 1. 创建 MinIO 客户端
        client = Minio(
            minio_endpoint,
            access_key=minio_access_key,
            secret_key=minio_secret_key,
            secure=minio_secure
        )

        # 2. 如果未指定对象名称，使用文件名
        if object_name is None:
            object_name = os.path.basename(file_path)

        # 3. 检查存储桶是否存在，不存在则创建
        if not client.bucket_exists(bucket_name):
            client.make_bucket(bucket_name)
            print(f"创建存储桶: {bucket_name}")

        # 4. 上传文件
        client.fput_object(
            bucket_name,
            object_name,
            file_path
        )

        print(f"文件 '{file_path}' 成功上传到存储桶 '{bucket_name}' 作为对象 '{object_name}'")

        # 5. 获取文件 URL（可选）
        file_url = client.presigned_get_object(bucket_name, object_name)
        print(f"文件访问 URL: {file_url}")

        return file_url

    except S3Error as e:
        print(f"MinIO 错误: {e}")
        raise
    except Exception as e:
        print(f"上传失败: {str(e)}")
        raise


def get_object_from_minio(bucket_name):
    """
    上传文件到 MinIO

    参数:
        file_path: 本地文件路径
        bucket_name: MinIO 存储桶名称
        object_name: 在 MinIO 中的对象名称（可选，默认为文件名）
    """
    # 从环境变量获取 MinIO 配置
    minio_endpoint = os.getenv("MINIO_ENDPOINT", "localhost:9000")
    minio_access_key = os.getenv("MINIO_ACCESS_KEY", "minioadmin")
    minio_secret_key = os.getenv("MINIO_SECRET_KEY", "minioadmin")
    minio_secure = os.getenv("MINIO_SECURE", "False") == "True"  # 是否使用 SSL
    f = open("file.txt", "w")

    try:
        # 1. 创建 MinIO 客户端
        client = Minio(
            minio_endpoint,
            access_key=minio_access_key,
            secret_key=minio_secret_key,
            secure=minio_secure
        )

        objects = client.list_objects(bucket_name, recursive=True)

        # 提取文件名列表
        # file_names = [obj.object_name for obj in objects]
        # file_names = []
        for obj in objects:
            # file_names.append(obj.object_name)
            f.write(obj.object_name + "\n")


    except S3Error as e:
        print(f"MinIO 错误: {e}")
        raise
    except Exception as e:
        print(f"上传失败: {str(e)}")
        raise

if __name__ == "__main__":
    # # 配置参数
    # LOCAL_FILE = "data.json"  # 要上传的本地文件
    BUCKET_NAME = "crawler"  # MinIO 存储桶名称
    # OBJECT_NAME = "test_data1.json"  # 在 MinIO 中的对象名称（可选）
    #
    # # 执行上传
    # upload_file_to_minio(LOCAL_FILE, BUCKET_NAME, OBJECT_NAME)
    get_object_from_minio(BUCKET_NAME)
